// 其实泛型类和泛型接口的区别不是特别大

abstract class Cache<T> {
  getByKey(String key);
  void setByKey(String key, T value);
}

// 子类的实现，别忘了，父类和子类的名字后面都要加<T>
class FileCache<T> implements Cache<T> {
  @override
  getByKey(String key) {
    return null;
  }

  @override
  void setByKey(String key,T value) {}
}

class MemoryCache<T> implements Cache<T> {
  @override
  getByKey(String key) {
    return null;
  }

  @override
  void setByKey(String key, T value) {
    print('我把key为$key，value为$value的数据写入到了内存');
  }
}

void main() { 
  var mc = new MemoryCache<String>();
  mc.setByKey('index', 'ZZZZZZZ');
}
